package com.bz.cart.service.impl;

import com.bz.cart.feign.CommonItemFeignClient;
import com.bz.cart.feign.CommonRedisFeignClient;
import com.bz.cart.service.RedisCartService;
import com.bz.dto.CartDto;
import com.bz.pojo.TbItem;
import com.bz.utils.Result;
import com.bz.vo.CartItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * 用户已登录状态下的购物车操作业务
 */
@Service
public class RedisCartServiceImpl implements RedisCartService {

    @Autowired
    private CommonItemFeignClient commonItemFeignClient;

    @Autowired
    private CommonRedisFeignClient commonRedisFeignClient;

    @Override
    public Result addItem(Long itemId, Integer num, String userId) {
        //1,查询商品
        TbItem tbItem = this.selectItemById(itemId);
        //2,获取购物车
        CartDto cartDto = this.getCart(userId);
        //3,将商品添加大购物车中
        this.addItemToCart(cartDto,tbItem,num,itemId);
        //4,将购物车缓存到redis中
        this.addCartToRedis(userId,cartDto);
        return null;
    }

    /**
     * 4,将购物车缓存到redis中
     */
    private void addCartToRedis(String userId,CartDto cartDto){
        cartDto.setUserId(Long.valueOf(userId));
        this.commonRedisFeignClient.insertCart(cartDto);
    }

    /**
     * 3将商品添加到购物车中
     * @param cartDto
     * @param tbItem
     * @param num
     * @param itemId
     */
    private void addItemToCart(CartDto cartDto,TbItem tbItem,Integer num,Long itemId){
        Map<String, CartItemVo> cartItemVoMap = cartDto.getCartItemVoMap();
        CartItemVo cartItemVo = cartItemVoMap.get(itemId.toString());
        if(cartItemVo == null){
            //没有相同的商品
            CartItemVo cartItem = new CartItemVo();
            cartItem.setId(tbItem.getId());
            cartItem.setImage(tbItem.getImage());
            cartItem.setNum(num);
            cartItem.setPrice(tbItem.getPrice());
            cartItem.setSellPoint(tbItem.getSellPoint());
            cartItem.setTitle(tbItem.getTitle());
            cartItemVoMap.put(tbItem.getId().toString(),cartItem);
        }else{
            cartItemVo.setNum(cartItemVo.getNum()+num);
        }
    }

    /**
     * 2根据用户ID获取Redis中的购物车
     */
    private CartDto getCart(String userId){
        CartDto cartDto = commonRedisFeignClient.selectCartByUserId(userId);
        if (cartDto != null){
            return cartDto;
        }
        return new CartDto();
    }

    /**
     * 1根据商品Id查询商品
     */
    private TbItem selectItemById(Long itemId){
        return this.commonItemFeignClient.selectItemInfo(itemId);
    }
}
